package com.hsylient.javase.chapter11.future;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;
import java.util.stream.Stream;

@Slf4j
public class CompletableFutureTest {

    @SneakyThrows
    public static void main(String[] args) {

        // 创建一个CompletableFuture，并用异步任务执行
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            // 模拟一个耗时操作
            log.info("我真帅！！！！");
            try {
                TimeUnit.SECONDS.sleep(10);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            return "Hello";
        });

        // 当任务完成后，在结果上应用操作
        future.thenApply(result -> result + " World")
                .thenAccept(finalResult -> log.info("Processed Result: " + finalResult));

        // 这里可以进行其他操作，不会阻塞上面的异步任务
        log.info("aaaaaaaaaaaaaaaaaaaaaaa");

        // 等待异步任务完成（在实际应用中，这个操作可能不需要）
        future.join();

    }


    @Test
    public void testDealMutTask() throws InterruptedException {

        List<String> list = Collections.synchronizedList(new ArrayList<>());

        IntStream.range(0, 100).forEach(item -> CompletableFuture.supplyAsync(() -> {
            // 模拟耗时
            log.info("start...");
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            log.info("end...");
            return String.valueOf(item);
        }).thenAccept(list::add));


        TimeUnit.SECONDS.sleep(1114);

        System.out.println(list);


    }
}
